package Ordenamiento;
public class Radix
{
   /**
    * @param x
    *           recibe el arreglo
    * @author HugoAlberto
    */
   public int[] radixsort(int x[])
   {
      if(x.length==0)
         return x; // si no tiene elementos regresa el arreglo
      int[][] np=new int[x.length][2]; // utiliza una matriz
      int[] q=new int[256];
      int i,j,k,l,f=0;
      for(k=0; k<4; k++)
      {
         for(i=0; i<(np.length-1); i++)
            np[i][1]=i+1;
         np[i][1]=-1;
         for(i=0; i<q.length; i++)
            q[i]=-1;
         for(f=i=0; i<x.length; i++)
         {
            j=((255<<(k<<3))&x[i])>>(k<<3);
            if(q[j]==-1) l=q[j]=f;
            else
            {
               l=q[j];
               while(np[l][1]!=-1)
                  l=np[l][1];
               np[l][1]=f;
               l=np[l][1];
            }
            f=np[f][1];
            np[l][0]=x[i];
            np[l][1]=-1;
         }
         for(l=q[i=j=0]; i<256; i++)
            for(l=q[i]; l!=-1; l=np[l][1])
               x[j++]=np[l][0];
      }
      return x;
   }
}
